package com.example.domain.dto.pricelist;

import com.example.domain.dto.MoneyDTO;
import com.example.domain.entity.PriceListEntry;
import com.example.domain.valueobject.Money;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * 价目表条目DTO
 * 
 * @author Means
 * @since 2025-10-27
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PriceListEntryDTO {
    
    /**
     * 条目ID
     */
    private String id;
    
    /**
     * 价目表ID
     */
    private String priceListId;
    
    /**
     * 商品ID
     */
    private String productId;
    
    /**
     * 商品名称（冗余字段，需要关联查询填充）
     */
    private String productName;
    
    /**
     * 单价
     */
    private MoneyDTO unitPrice;
    
    /**
     * 基础单位
     */
    private String baseUnit;
    
    /**
     * 基础单位名称（冗余字段，需要关联查询填充）
     */
    private String baseUnitName;
    
    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updatedAt;
    
    /**
     * 从实体类创建DTO（基础版本，不包含关联信息）
     * 
     * @param entry 价目表条目实体
     * @return PriceListEntryDTO
     */
    public static PriceListEntryDTO from(PriceListEntry entry) {
        if (entry == null) {
            return null;
        }
        
        return PriceListEntryDTO.builder()
                .id(entry.getId())
                .priceListId(entry.getPriceListId())
                .productId(entry.getProductId())
                .unitPrice(Money.of(entry.getUnitPrice()) != null ? MoneyDTO.from(Money.of(entry.getUnitPrice())) : null)
                .baseUnit(entry.getBaseUnit())
                .createdAt(entry.getCreatedAt())
                .updatedAt(entry.getUpdatedAt())
                .build();
    }
}

